/**
 * 文件名：PermissionFilter.java
 *
 * 创建人：虞云波 - .com
 *
 * 创建时间：2017年11月30日 下午4:26:11
 *
 * 版权所有：江苏晟邦网络科技有限公司
 */
package com.cbwl.eoas.cms.web.controller.security;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

/**
 * <p>[描述信息：说明类的基本功能]</p>
 *
 * @author 虞云波 - yuyunbo@3856.cc
 * @version 1.0 Created on 2017年11月30日 下午4:26:11
 */
public class PermissionFilter extends AccessControlFilter {

	
	private static final Log LOG = LogFactory.getLog(PermissionFilter.class);
	
	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
		HttpServletRequest req = WebUtils.toHttp(request);
		String path = req.getServletPath();
		LOG.info("path:" + path);
		
		//先判断带参数的权限判断
		Subject subject = getSubject(request, response);
		if(null != mappedValue){
			String[] arra = (String[])mappedValue;
			for (String permission : arra) {
				if(subject.isPermitted(permission)){
					return Boolean.TRUE;
				}
			}
		}
		
		HttpServletResponse resp = (HttpServletResponse) response;
		String requestType = req.getHeader("X-Requested-With");
		/**
		 * 此处是改版后，为了兼容项目不需要部署到root下，也可以正常运行，但是权限没设置目前必须到root 的URI，
		 * 原因：如果你把这个项目叫 ShiroDemo，那么路径就是 /ShiroDemo/xxxx.shtml ，那另外一个人使用，又叫Shiro_Demo,那么就要这么控制/Shiro_Demo/xxxx.shtml 
		 * 理解了吗？
		 * 所以这里替换了一下，使用根目录开始的URI
		 */
		
		String uri = req.getRequestURI();//获取URI
		String basePath = req.getContextPath();//获取basePath
		if(null != uri && uri.startsWith(basePath)){
			uri = uri.replaceFirst(basePath, "");
		}
		if(subject.isPermitted(uri)){
			return Boolean.TRUE;
		}
		// 判断是否是ajax请求
		if ("XMLHttpRequest".equals(requestType)) {
			resp.sendError(800, "您尚未登录,请登录后操作!");
		} else {
			WebUtils.saveRequest(req);
			WebUtils.issueRedirect(req, resp, "/login/loginInit.html");
		}
		return Boolean.FALSE;
	}

	@Override
	protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
		Subject subject = getSubject(request, response);  
        if (null == subject.getPrincipal()) {//表示没有登录，重定向到登录页面  
            saveRequest(request);  
            WebUtils.issueRedirect(request, response, "/login/loginInit.html");
        } else {  
//            if (StringUtils.hasText(ShiroFilterUtils.UNAUTHORIZED)) {//如果有未授权页面跳转过去  
//                WebUtils.issueRedirect(request, response, ShiroFilterUtils.UNAUTHORIZED);  
//            } else {//否则返回401未授权状态码  
//                WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);  
//            }  
        }  
	return Boolean.FALSE;
	}

	
	
	
}
